package com.instituto.estadistica;

import java.io.*;
import java.util.Calendar;

public class main {

  public static void main(String[] args) throws IOException {
    String codigo3cifras;
    do{
    // Pedimos el codigo de la clase y lo validamos.
    System.out.print("Código de una clase: debe tener 3 cifras y empezar por 3. (0 para salir): ");
    BufferedReader lectura = new BufferedReader(new InputStreamReader(System.in));
    codigo3cifras = lectura.readLine();


    if ((!"0".equals(codigo3cifras)) && (codigo3cifras.charAt(0)=='3') && (codigo3cifras.length() ==3)){
      
          // Pedimos el número de alumnos de una clase.
          System.out.print("Numero de alumnos de la clase:");
          BufferedReader valorString = new BufferedReader(new InputStreamReader(System.in));
          String numAlumnosString = valorString.readLine();
          int numAlumnosInt = Integer.parseInt(numAlumnosString);

          // Objetos.
          alumno[] alumnosClase = new alumno[numAlumnosInt];   // Creamos un array que contiene objetos alumno dónde almacenar valores.
          clase claseActual = new clase(codigo3cifras, 0, 0, 0, 0, 0, 0, 0, 0, 0); // Creamos el objeto de la clase para almacenar valores comunes.
          
          for (int i = 0; i < alumnosClase.length; i++) { //Comenzamos a pedir datos de los alumnos, tantas veces como alumnos haya.
              System.out.println("-----");
              //DNI           
              alumnosClase[i] = new alumno();
              System.out.print("DNI del " + alumno.ordinal(i, alumnosClase.length) + " alumno sin letra:");
              BufferedReader valorDNI = new BufferedReader(new InputStreamReader(System.in));
              String DNIString = valorDNI.readLine(); // Capturamos
              long lecturaDNILong = Integer.parseInt(DNIString); // Parsing
              alumnosClase[i].setDni(lecturaDNILong); // Almacenamos el DNI en el alumno en cuestión.
             
              //EDAD
              int lecturaEdadInt; //Declaramos la variable para poder utilizarla fuera del bucle do..while
              do {
                  System.out.print("Edad del " + alumno.ordinal(i, alumnosClase.length) + " alumno (>=18):");
                  BufferedReader valorEdad = new BufferedReader(new InputStreamReader(System.in));
                  String edadAlumnoString = valorEdad.readLine(); //Capturamos
                  lecturaEdadInt = Integer.parseInt(edadAlumnoString); // Parsing
                  alumnosClase[i].setEdad(lecturaEdadInt);  // Almacenamos la EDAD en el alumno en cuestión.
              } while (lecturaEdadInt < 18);

              //AÑOENTRADA
              int lecturaEntradaInt; //Declaramos la variable para poder utilizarla fuera del bucle do..while
              do {
                  System.out.print("Año de entrada del " + alumno.ordinal(i, alumnosClase.length) + " alumno (>=1980):");
                  BufferedReader valorEntrada = new BufferedReader(new InputStreamReader(System.in));
                  String valorEntradaString = valorEntrada.readLine(); //Capturamos
                  lecturaEntradaInt = Integer.parseInt(valorEntradaString); //Parsing
                  alumnosClase[i].setEntrada(lecturaEntradaInt);  // Almacenamos el año de ENTRADA en el alumno en cuestion
                  
                  Calendar c1 = Calendar.getInstance(); // Fecha actual
                  String annio = Integer.toString(c1.get(Calendar.YEAR)); //Cogemos el año actual
                  int annioInt = Integer.parseInt(annio); //Parsing
                  if(alumno.calcularAntiguedad(alumnosClase[i].getEntrada(), annioInt)){ //Si calcularAtiguedad devuelve TRUE, subimos el contador
                    claseActual.setAlumnos2annosContador(); //Incrementamos el contador de alumnos en el centro con más de 2 años de antiguedad.
                  }
              } while (lecturaEntradaInt < 1980); //Haremos todo esto hasta que el año de entrada al colegio sea mayor de 1980

              //SEXO
              char lecturaSexoChar; //Declaramos la variable para poder utilizarla fuera del bucle do..while
              do {
                  System.out.print("Sexo del " + alumno.ordinal(i, alumnosClase.length) + " alumno (M/F):");
                  BufferedReader valorSexo = new BufferedReader(new InputStreamReader(System.in));
                  String valorSexoString = valorSexo.readLine(); //Capturamos
                  lecturaSexoChar = valorSexoString.charAt(0); //Cogemos el primer Char de la cadena que capturamos.
                  alumnosClase[i].setSexo(lecturaSexoChar); //Almacenamos el sexo en el objeto alumno correspondiente.

              } while (lecturaSexoChar != 'M' && lecturaSexoChar != 'F'); //Haremos esto siempre que no sea o M o F, con los que se sale del do..while

              //Actualizamos los contadores de la clase para luego hacer los cálculos pedidos.
              if (lecturaSexoChar == 'M'){
                claseActual.incrementaSexoTodos();
                claseActual.incrementaSexoM();
                claseActual.incrementarEdadTodos(alumnosClase[i].getEdad());
                claseActual.incrementarEdadM(alumnosClase[i].getEdad());
                }else{
                claseActual.incrementaSexoTodos();
                claseActual.incrementaSexoF();
                claseActual.incrementarEdadTodos(alumnosClase[i].getEdad());
                claseActual.incrementarEdadF(alumnosClase[i].getEdad());
                }

              //PEDIMOS #HERMANOS
              System.out.print("Número de hermamos del " + alumno.ordinal(i, alumnosClase.length) + " alumno:");
              BufferedReader valorHermanos = new BufferedReader(new InputStreamReader(System.in));
              String valorHermanosString = valorHermanos.readLine(); //Capturamos
              int valorHermanosInt = Integer.parseInt(valorHermanosString);
              alumnosClase[i].setHermanos(valorHermanosInt);

              //Miramos si este alumno es familia numerosa, y si es así, incrementamos el contador de familias numerosas en la clase.
              if(alumnosClase[i].getHermanos() >= 2){
                claseActual.incrementaFamiliasNumerosas();
              }
          }

        //Imprimimos el valor almacenado en los objetos alumno.
        System.out.println("-----");
        for (int i = 0; i < alumnosClase.length; i++) {
            System.out.println("DNI: " + alumnosClase[i].getDni() + " Edad: " + alumnosClase[i].getEdad() + " Entrada: " +
            alumnosClase[i].getEntrada() + " Sexo: " + alumnosClase[i].getSexo() + " Hermanos: " + alumnosClase[i].getHermanos());
        }

        //Imprimimos los cálculos.
        System.out.println("----- PORCENTAJES: ");
        System.out.println("% chicos: " + ( (double)claseActual.getSexoM() / (double)claseActual.getSexoTodos() ) * 100);
        System.out.print("% chicas: " + ( (double)claseActual.getSexoF() / (double)claseActual.getSexoTodos() ) * 100);
        System.out.println("----- EDAD: ");
        
        try{ //Capturamos la excepción por si la división de la media es por cero.
        System.out.println("Media de edad de las chicos: " + claseActual.getEdadM() / claseActual.getEdadContadorM());
        }catch (ArithmeticException e){
            System.out.println("La media de edad de las chicos está fuera de rango (división por cero). ");
        }
        try{ //Capturamos la excepción por si la división de la media es por cero.
            System.out.println("Media de edad de las chicas: " + claseActual.getEdadF() / claseActual.getEdadContadorF());
        }catch (ArithmeticException e){
            System.out.println("La media de edad de las chicas está fuera de rango (división por cero). ");
        }

        System.out.println("----- ALUMNOS CON MÁS DE 2 AÑOS EN EL CENTRO: " + claseActual.getAlumnos2annosContador());

        System.out.println("----- NUMERO DE ALUMNOS CON FAMILIA NUMEROSA:" + claseActual.getFamiliasNumerosas());
        
      }else if ("0".equals(codigo3cifras)){ //Si metes el código 0 de clase, se sale de la aplicación.
        System.out.println("Gracias. ");
      }else{
        System.out.println("El código de clase es incorrecto. "); // Para todos los casos que el código sea incorrecto.
      }
        
      if("0".equals(codigo3cifras)){ //Si metes el código 0 de clase, se sale de la aplicación.
          System.out.println("-----");
          System.out.println("FIN");
      }
   }while((!"0".equals(codigo3cifras)) || (codigo3cifras.charAt(0)=='3') || (codigo3cifras.length() ==3)); //Se hará el DO de nueva clase, si se cumple.
  }
}


